#ifndef __MYCONFIG_H_
#define __MYCONFIG_H_
#include "stdint.h"
#include "stdbool.h"
#define VERSION v2.7.0 
#define FOUR_WHEEL     //此时是四个轮子有驱动，轮子处于正常位
//#define TWO_WHEEL  //此时是两个轮子有驱动，两个轮子在正中间
#ifdef FOUR_WHEEL
//#define FOUR_ENCODER  //四个编码器

#endif // FOUR_WHEEL
#define FIND_TREASURE 1 //寻宝模式
#define TRAVEL 2        //旅游模式
#define GAME_MODE TRAVEL //比赛类型
#define GAME_MAP  TRAVEL //比赛地图

//定义使用的显示屏，仅用于fonts文件的选择，如更换，需更改display.c和display.h
//#define USE_OLED  //使用OLED显示屏
#define USE_LCD  //使用LCD显示屏

#define CAMERA_COLOR    //定义使用摄像头进行颜色识别，如果不需要就注释掉

#define CAR_WHEEL_LR_DISTANCE 180 //左右两个轮子的中线之间的距离，单位为mm
#define CAR_WHEEL_FB_DISTANCE 180 //前后两个轮子的中线之间的距离，单位为mm,还未用到
//虚拟的左右两个轮子的中线之间的距离，单位为mm,用于控制转弯半径，
//计算方式为令两个轮子的转速比为1：3，计算出的走的圆的半径，此半径即为虚拟的左右两个轮子的中线之间的距离
//推导过程见文档
#define CAR_WHEEL_LR_DISTANCE_VIRTUAL 340 
/**
 * @brief      状态类型
 */

typedef enum
{
   MY_OK,               //就绪态
   MY_BUSY,             //运行态
   MY_STANDBY,          //待命，阻塞态
   MY_EXIT,             //退出态
}My_StatusTypeDef;
#define MY_READY MY_OK  //就绪态
#define MY_BLOCKED MY_STANDBY//阻塞态
#define MY_Running MY_BUSY //运行态
//常用函数
static inline int_least16_t u16_to_int(uint16_t data_in)
{
	return data_in & 0x7FFF ? 32768 - data_in : data_in;
}
// 16位整数的绝对值函数
static inline int16_t abs16(int16_t data_in)
{
    return data_in < 0 ? -data_in : data_in;
}
/**
 * @brief 检查一个数是否在两个给定的数之间（包含两个数本身）
 * 
 * @param x 要检查的数
 * @param a 范围的一个端点
 * @param b 范围的另一个端点
 * @return true 如果 x 在 a 和 b 之间（包含 a 和 b）
 * @return false 如果 x 不在 a 和 b 之间
 */
static inline bool inRange(int32_t x, int32_t a, int32_t b)
{
    return a < b ? (x >= a && x <= b) : (x >= b && x <= a);
}

#define max(a,b)			(a>b ? a:b)
#define min(a,b)			(a<b ? a:b)
#define limit(x,a,b)	(min(max(x,a) , b))
#endif // !__MYCONFIG_H_
